package com.tom.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.tom.config.GetLogin;
import com.tom.constants.CourseConstants;
import com.tom.doc.CourseDoc;
import com.tom.domain.*;
import com.tom.dto.CourseDto;
import com.tom.exception.GloblException;
import com.tom.feign.clients.CourseFeignClient;
import com.tom.mapper.CourseMapper;
import com.tom.service.ICourseDetailService;
import com.tom.service.ICourseMarketService;
import com.tom.service.ICourseService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.tom.service.ICourseTypeService;
import com.tom.to.EmailTo;
import com.tom.to.MessageTo;
import com.tom.to.SMSTo;
import com.tom.util.AjaxResult;
import com.tom.util.AssertUtil;
import org.apache.catalina.User;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;

import static com.tom.constants.MQConstants.*;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author pengh.liu
 * @since 2021-11-26
 */
@Service
@Transactional
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements ICourseService {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private CourseFeignClient courseFeignClient;

    @Autowired
    private ICourseTypeService courseTypeService;

    @Autowired
    private CourseMapper courseMapper;

    @Autowired
    private ICourseDetailService courseDetailService;

    @Autowired
    private ICourseMarketService courseMarketService;

    /**
     * 新增的方法
     * @param courseDto
     */
    @Override
    public void save(@Valid CourseDto courseDto) {
        // 获取login的对象
        Login login = GetLogin.getLogin();
        if (login == null){
            throw new GloblException("请登录兄弟");
        }

        Course course = courseDto.getCourse();
        CourseDetail courseDetail = courseDto.getCourseDetail();
        CourseMarket courseMarket = courseDto.getCourseMarket();

        // 参数判断
        EntityWrapper wrapper = new EntityWrapper();
        // 王wrapper里面传值，前面一个字段是数据库表中的名字，后面是你传的值
        wrapper.eq("name", course.getName());
        Course course1 = super.selectOne(wrapper);
        AssertUtil.isNull(course1, "该课程已经存在");
        // 添加课程表格

        course.setUserId(login.getId());
        course.setUserName(login.getUsername());
        course.setTenantId(login.getTenantId());
        course.setTenantName(login.getTenantName());
        course.setStatus(CourseConstants.OFFLINE_COURSE);
        course.setCommentCount(0);
        course.setViewCount(0);
        course.setSaleCount(0);
        super.insert(course);
        // 添加课程明细表,主键id和课程同步
        courseDetail.setId(course.getId());
        courseDetailService.insert(courseDetail);
        // 添加营销表,主键id和课程同步
        courseMarket.setId(course.getId());
        courseMarketService.insert(courseMarket);
        // 增加课程类型的数量
        CourseType courseType = courseTypeService.selectById(course.getCourseTypeId());
        String path = courseType.getPath();
        String[] pids = path.split("\\.");
        courseTypeService.addTotalCountByIds(1,pids);
    }

    /**
     * 上架的方法
     * @param id
     */
    @Override
    public void onLineCourse(Long id) {
        // 通过id查询出课程
        Course course = super.selectById(id);
        // 判断课程是否已经上架
        AssertUtil.Equas(course.getStatus(),CourseConstants.ONLINE_COURSE,"不能重复上架");
        // 将课程对象修改为上架状态
        course.setStatus(CourseConstants.ONLINE_COURSE);
        // 设置上架的时间
        course.setOnlineTime(new Date());
        // 将修改的数据至持久化导数据库中
        courseMapper.updateById(course);
        // 新建doc对象目的是由于不是所有的字段都需要展示所以值在feign只需要接受一些字段
        // CourseDoc这个对象实在feign中申明的所以在这里需要导包
        CourseDoc courseDoc = new CourseDoc();
        // 通过id查寻促销的表
        CourseMarket courseMarket = courseMarketService.selectById(id);
        // 将相同的字段拷贝到courseDoc中
        BeanUtils.copyProperties(course, courseDoc);
        BeanUtils.copyProperties(courseMarket, courseDoc);
        // 修改其中的一个字段免费为1，不免费为2
        courseDoc.setChargeName(courseMarket.getCharge()==1?"免费":"收费");
        // 调用feign接口
        AjaxResult ajaxResult = courseFeignClient.courseOnLine(courseDoc);
        if(!ajaxResult.isSuccess()){
            throw new GloblException("课程上架失败");
        }
        sendMessages(course);
    }

    // 读取配置文件中的信息
    @Value("${message.content.sms.course-publish}")
    private String smsContants;
    @Value("${message.content.message.course-publish}")
    private String messageContants;
    @Value("${message.content.email.course-publish}")
    private String emailContants;
    /**
     * 发送课程上线的消息
     */
    private void sendMessages(Course course) {
        // 发送消息，第一个参数为交换机，第二个参数是糅tingKey，第三个参数为发送的参数对象，第四个参数为发送的消息
        rabbitTemplate.convertAndSend(EXCHANGE_NAME_TOPIC, "course.sms", new SMSTo(Arrays.asList("1124","3452"),String.format(smsContants,course.getName())));
        rabbitTemplate.convertAndSend(EXCHANGE_NAME_TOPIC, "course.email", new EmailTo(Arrays.asList("1124.@com","3452.@com"),"有新课",String.format(emailContants,course.getName())));
        rabbitTemplate.convertAndSend(EXCHANGE_NAME_TOPIC, "course.message", new MessageTo(Arrays.asList(1L,2L),"有新课",String.format(messageContants,course.getName())));
    }

    /**
     * 下架的方法
     * @param id
     */
    @Override
    public void offLineCourse(Long id) {
        Course course = super.selectById(id);
        AssertUtil.Equas(course.getStatus(),CourseConstants.OFFLINE_COURSE,"该商品就是下架状态");
        course.setStatus(CourseConstants.OFFLINE_COURSE);
        course.setOfflineTime(new Date());
        courseMapper.updateById(course);
        CourseDoc courseDoc = new CourseDoc();
        CourseMarket courseMarket = courseMarketService.selectById(id);
        BeanUtils.copyProperties(course, courseDoc);
        BeanUtils.copyProperties(courseMarket, courseDoc);
        courseDoc.setChargeName(courseMarket.getCharge()==1?"免费":"收费");
        courseFeignClient.courseOffLine(courseDoc);
    }
}
